package java_learn.java_web.基础增强.反射;

import java.lang.reflect.Field;

/**
 * Class对象功能：
 * 获取功能：
 * 1. 获取成员变量们
 * Field[] getFields()
 * Field getField(String name)
 * <p>
 * Field[] getDeclaredFields()
 * Field getDeclaredField(String name)
 * 2. 获取构造方法们
 * Constructor<?>[] getConstructors()
 * Constructor<T> getConstructor(类<?>... parameterTypes)
 * <p>
 * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
 * Constructor<?>[] getDeclaredConstructors()
 * 3. 获取成员方法们：
 * Method[] getMethods()
 * Method getMethod(String name, 类<?>... parameterTypes)
 * <p>
 * Method[] getDeclaredMethods()
 * Method getDeclaredMethod(String name, 类<?>... parameterTypes)
 * <p>
 * 4. 获取类名
 * String getName()
 *
 * @Author: 李浩然
 * @Date: 2021/5/24 11:53 上午
 */
public class ReflectDemo02 {
    public static void main(String[] args) throws Exception {
        // * Field[] getFields()(获取所有public修饰的成员变量)
        Class person = Person.class;
        Field[] fields = person.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("----------");
        Field a = person.getField("a");

        //获取成员变量a的值
        Person p = new Person();
        a.set(p, "张三");
        Object val = a.get(p);
        System.out.println(val);

        //Field[] getDeclaredFields() 获取所有
        Field[] fields_all = person.getDeclaredFields();
        for (Field field : fields_all) {
            System.out.println(field);
        }
        Field d = person.getDeclaredField("d");

        //忽略访问权限修饰符的安全检查
        d.setAccessible(true); //暴力反射
        Object value2 = d.get(p);
        System.out.println(value2);
    }
}
